package com.tarena.sentinel.study.demo02.datasource;

import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;

import java.net.URL;
import java.util.List;

/**
 * 自定义的数据源
 */
public class MyDatasource implements InitFunc {
    /**
     * 把之前在启动类编写那套加载逻辑 放到这个数据源里呢
     */
    @Override
    public void init() throws Exception {
        System.out.println("当前自定义数据源初始化init加载了");
        //读取文件 选择使用类加载器读取文件 flowRules.json
        ClassLoader classLoader = MyDatasource.class.getClassLoader();
        URL resource = classLoader.getResource("flowRules.json");
        String path = resource.getFile();// flowRules.json
        System.out.println(path);
        //sentinel提供的一套api方法 ,直接将文件交给sentinel读流 转化成List<FlowRule>
        ReadableDataSource<String,List<FlowRule>> datasource=
                new FileRefreshableDataSource<List<FlowRule>>(path,
                        new Converter<String, List<FlowRule>>() {
                            /**
                             * @param json fileName文件中的json格式的文本
                             * @return 使用 json转化成对象 (fastJson)
                             */
                            @Override
                            public List<FlowRule> convert(String json) {
                                return JSON.parseArray(json,FlowRule.class);
                            }
                        });
        //将规则对象的内容 注册到 sentinel
        FlowRuleManager.register2Property(datasource.getProperty());

        /*//在容器启动之后 设置sentinel规则.
        //定义一个规则 数组 流控规则FlowRule 熔断规则DegradeRule 系统规则SystemRule
        List<FlowRule> flowRules=new ArrayList<>();
        //生成一个 规则对象
        FlowRule flowRule=new FlowRule();
        //使用这个规则绑定过一个资源
        flowRule.setResource("sayHi");
        //设定 限流 方式 0=并发限流 1=qps限流
        flowRule.setGrade(1);
        //限流阈值
        flowRule.setCount(100);
        //添加到规则数组中,
        flowRules.add(flowRule);
        //sentinel加载这个数组.
        //为repos资源定义规则
        FlowRule flowRule1=new FlowRule();
        flowRule1.setResource("sayHiRepo");
        //设定 限流 方式 0=并发限流 1=qps限流
        flowRule1.setGrade(1);
        //限流阈值
        flowRule1.setCount(1);
        //添加到规则数组中,
        flowRules.add(flowRule1);
        FlowRuleManager.loadRules(flowRules);*/
    }
}
